(function($){
    $.fn.go_search = function(options) {

        var _elem = $(this);
        
        var opt = {
            onKeyUp        : function(){},
            keyNavigation  : function(){},
            placeholder    : ""
        }

        _elem.bind("updateOptions", updateOptions).data("currentValue",_elem.val());

        var _ieVersion = getIEVersion();
         
        if( _ieVersion < 8 && _ieVersion > 0)
            _elem.css("margin-top","5px");

        opt =  $.fn.extend(opt,options);
        
        var tmpTextFiled        = $("<input type='text' name='tmpInput' class='ui-widget-content' style='display:none' />");
        var field_autocompl     = $("<div class='field_autocompl'>");
        var field_imput         = $("<div class='field_imput'></div>");
        var field_input_select  = $("<div class='field_imput field_input_select'>");
        var cursor              = $("<div class='cursor' style='display:none;'></div>");


        $(document).bind({
            keydown : function (event){
               
               if($(this).length >0 && "#"+$(event.target).attr("id") == searchID && event.keyCode == 9 && $(searchID).val() != "") {
                   
                   if(field_autocompl.text() == $(searchID).val())
                   {
                     $(searchID).trigger("tabOut");  
                   } 
                   event.preventDefault(); event.stopPropagation(); 
               }
            }
        });
        

        _elem.after(field_autocompl, field_imput, field_input_select, cursor);
        
        
        var _form = _elem.parents('form'); 
        
        if(_form.length > 0)
            _form.after($('<div class="form-element hidden"></div>').append(tmpTextFiled));
        else
            _elem.after($('<div class="form-element hidden"></div>').append(tmpTextFiled));
        
        var searchID = '#' + _elem.attr('id');
        
        cloneStyle();
        
        if(navigator.appName.indexOf("Internet Explorer") != -1) {
           if(getIEVersion() <= 8)
             $(".main_search, .field_autocompl, .field_imput, .cursor").css('height','1.85em');
           else
            $(".main_search, .field_autocompl, .field_imput, .cursor").css('height','1.9em');
       }

        _elem.bind("set_cursor", set_cursor);
        _elem.bind("set_placeholder", set_placeholder);
        _elem.bind("show_placeholder",show_placeholder);

        _elem.bind({'click' : function(event){ $(this).trigger("set_cursor")}});

       _elem.bind('mouseup',selectedTextIE);
       _elem.bind('_reset',_reset);
       _elem.bind('changeValue',changeValue);
       _elem.select(selectedTextIE);
       
       field_autocompl.bind('mousedown',function(){ $(this).prev('input').focus().trigger('setFocus');  if($.browser.msie) _elem.get(0).focus();  });

       if(jQuery.trim(_elem.val()) == "")
               field_autocompl.text(opt.placeholder);

        _elem.bind({
            'focusin' : function(event){
                tmpTextFiled.addClass('ui-state-focus'); 
                cloneStyle();
                
                field_imput.css('color', tmpTextFiled.addClass('ui-state-focus').css('color'));
                
                if($(searchID).data("interv") && !$.browser.msie)
                {
                    clearInterval($(searchID).data("interv"));
                    $(searchID).removeData("interv");
                    cursor.css("display","none");
                }

                if(jQuery.trim($(searchID).val()) == "")
                        field_autocompl.empty();

                if(!$.browser.msie){
                    var interv = setInterval(function(){cursor.toggle();},600);
                    $(searchID).data("interv",interv);

                    $(this).trigger("set_cursor");
                }
                this.focus();
            }
        });



        _elem.focusout(function(event){
             var elm = $(this);
            tmpTextFiled.removeClass('ui-state-focus');
            cloneStyle();
            
            setTimeout( function () { elm.trigger("mouseup");},100);


            if($(this).data("interv") && !$.browser.msie)
            {
                    clearInterval($(this).data("interv"));
                    cursor.css("display","none");
            }

            if(jQuery.trim($(this).val()) == "")
               field_autocompl.text(opt.placeholder);
               
            if(document.activeElement == this){ if(!$.browser.msie) document.activeElement =$("body").get(0); else document.body.focus(); }
  
        });

        _elem.bind("setFocus",function(){
            var inp = $(this);
            setTimeout(function(){ inp.focus(); inp.trigger("show_placeholder") },100);
        });

        _elem.bind("set_values",function(event)
        {
              field_imput.text($(this).val());
              $(this).trigger("set_cursor");
        });


        _elem.bind("set_autoc",function (event,value){
            if(typeof value != "undefined"){
                value = value.replace(/<strong>[^<>]*<\/strong>/i,"");
                value = (value == "") ? field_imput.text() : jQuery.trim(field_imput.text())+value;
                field_autocompl.text(value);
            }
        });

        _elem.bind("ischange",trigger_values).addFieldTrigger();
        _elem.bind("keyup", function(event) {
            var field = $(this);
            if(event.keyCode == 13) { if(field.val().length == 0) return; field.trigger("ischange");}

            if(event.keyCode == 37 || event.keyCode == 39)
                _elem.trigger("set_cursor");
            
            if(event.keyCode == 9)
            {
                if(field.val().length == 0)
                    return;

                field.val(field.val());
                field_imput.text(field_autocompl.text());
                field.val(field_autocompl.text());
                field.trigger("set_cursor");
                    opt.onKeyUp(event,field);
                return;
            }
        });
        
        function cloneStyle() {
            field_autocompl.css({
                'background'        : tmpTextFiled.css('background'), 
                'background-image'  : tmpTextFiled.css('background-image'),  
                'background-color'  : tmpTextFiled.css('background-color'),
                'filter'            : tmpTextFiled.css('filter'), 
                'font-weight'       : tmpTextFiled.css('font-weight')
            });
            field_imput.css({
                    'color'         : tmpTextFiled.css('color'), 
                    'font-weight'   : tmpTextFiled.css('font-weight')
            });
            
            _elem.css({
                    'font-weight'   : tmpTextFiled.css('font-weight')
            });
            
            $("#tmp_p").css({
                    'color'         : tmpTextFiled.css('color'), 
                    'font-weight'   : tmpTextFiled.css('font-weight')
            });
        }

        function set_cursor(){

            var field = $(this);

            if($.browser.msie)
                return;

            var tmp_p = $("#tmp_p");    
                
            if(tmp_p.size() == 0) {
                $(searchID).parent().append("<p class='field_imput ui-helper-hidden-accessible' id='tmp_p'>"+field.val().substring(0,field.get(0).selectionStart)+"</p>");
                tmp_p = $("#tmp_p");
            }
            else
               tmp_p.text(field.val().substring(0,field.get(0).selectionStart));

               tmp_p.css("text-transform", $(searchID).css("text-transform"));
               
               var l = (tmp_p.width());
               if(l == 0)
                l=1;

                cursor.css('left',l+"px");
        }

        function trigger_values(event){
            var field = $(this);
            field.trigger("mouseup");

            //Cursor-Tasten
            if(event.keyCode == 40 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 37)
            {
                event.preventDefault(); event.stopPropagation();
                opt.keyNavigation(event);
                return;
            }

            field_autocompl.text(field.val());

           field.trigger("set_cursor");

            if(!$.browser.msie){
                if(event.keyCode != 32 && event.keyCode != 16)
                field.val(field.val());
            }

            field.trigger("set_values");

            if(event.type == "ischange" || field.val().length < 3)
                field.trigger("set_autoc","");

            opt.onKeyUp(event,field);
        }


        function selectedTextIE(event)
        {
            if(!$.browser.msie) return;
            bb(this);
            return;
        }

        function updateOptions (event,options) {
            opt =  $.fn.extend(opt,options);
        }

        function _reset(){
            $(this).val('').data('currentValue','');

            field_autocompl.text('');
            field_imput.text('');
        }

        function set_placeholder(event,value){
            opt.placeholder = value;
        }

        function show_placeholder(event){
            field_autocompl.text(opt.placeholder);
        }

        function changeValue(event,value) {
            field_autocompl.text('');
            $(this).val(value).data('currentValue',value).trigger("set_values");
        }

        function bb (a){
        try{

                var find_text = getSelText();

                if(find_text.length == 0)
                {
                    field_input_select.empty().css({'visibility' : 'hidden'});
                    return;
                }

                var e=a.createTextRange(),k=(a.ownerDocument||a.document).selection.createRange();e.inRange(k)&&(e.setEndPoint("EndToStart",k),c=e.text.length,e.setEndPoint("EndToEnd",k),f=e.text.length);

                var selectedText = e.text.substring(0,c)+"<span>"+find_text+"</span>"+e.text.substring(f,e.text.length);

                field_input_select.html(selectedText).css({'visibility' : 'visible'});

            }

            catch(h){ field_input_select.empty().css({'visibility' : 'hidden'}); }
        };

        return _elem;
    }
})(jQuery);

function getSelText () {

            var selText = "";
            if (window.getSelection) {  // all browsers, except IE before version 9
                if (document.activeElement &&
                        (document.activeElement.tagName.toLowerCase () == "textarea" ||
                         document.activeElement.tagName.toLowerCase () == "input"))
                {
                    var text = document.activeElement.value;
                    selText = text.substring (document.activeElement.selectionStart,
                                              document.activeElement.selectionEnd);
                }
                else {
                    var selRange = window.getSelection ();
                    selText = selRange.toString ();
                }
            }
            else {
                if (document.selection.createRange) {       // Internet Explorer
                    var range = document.selection.createRange ();
                    selText = range.text;
                }
            }

            return  selText;
        }

